<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //1. 简单的拷贝  ，拷贝对象

        // var obj = {
        //     name: "张三",
        //     age: 20
        // }

        // var arr = ["hello","world"];


        // 复制一份出来 ，和之前的对象没有引用关系 ；

        // console.log("obj",obj);
        // var obj2 = {};

        // // 把 obj里的属性 添加到obj2里；
        // // 通过循环把obj里的属性取出来添加到obj2对象里
        // for(var key in obj){
        //     obj2[key] = obj[key];
        // }

        // 封装成一个 拷贝函数  

        // function copy(obj) {
        //     var obj2 = {};
        //     for (var key in obj) {
        //         obj2[key] = obj[key];
        //     }
        //     return obj2
        // }

        // var obj2 = copy(arr);

        // console.log("obj2",obj2);
        // obj2.age = 100;
        // console.log("obj：", obj);
        // console.log("obj2：", obj2);


        // 2.既可以拷贝对象  有可以拷贝数组

        // console.log(typeof [])
        // console.log(typeof {});
        // console.log(Object.prototype.toString.call([]));
        // function copy(obj) {
        //     // var obj2 = [];
        //     // 根据传入的参数 判断 新生成对象 还是数组 ；
        //     var obj2 = Object.prototype.toString.call(obj)==="[object Array]"?[]:{};
        //     for (var key in obj) {
        //         obj2[key] = obj[key];
        //     }
        //     return obj2
        // }

        // // var arr = ["hello","world"];
        // var arr = {
        //     name:"hello"
        // }

        // var obj2 = copy(arr);
        // console.log(obj2);



        // 3.深层次拷贝的问题 

        function deepCopy(obj) {
            var obj2 = Object.prototype.toString.call(obj) === "[object Array]" ? [] : {};
            for (var key in obj) {
                if (obj.hasOwnProperty(key)) { // 判断是否是对象的自身属性
                    // obj[key] : 张三、20、{myname:"李四"}
                    if (typeof obj[key] === "object") {
                        // 证明键值是 对象或者是数组
                        // newobj = copy({myname:"李四"})
                        // obj['myobj'] = newobj
                        obj2[key] = deepCopy(obj[key]);
                    } else {
                        // 简单数据类型
                        obj2[key] = obj[key];
                    }
                }
            }
            return obj2
        }

        var obj = {
            name: "张三",
            age: 20,
            myobj: {
                myname: "李四",
            },
            fn: function () {
                console.log("fn")
            }
        }

        console.log(obj);
        var obj2 = deepCopy(obj);
        console.log(obj2);

        obj2.myobj.myname = "修改了";
        // console.log(obj);

        // obj2.age = 100;  // 改的是 对象的第一层数据
        // console.log(obj);

        /*
            1.复制一层对象 
            2. 复制一层对象或者是数组 
            3.通过递归复制多次对象 和数组
        
        
        
        */
    </script>
</body>

</html>